import cv2
import numpy as np


def generate_metal_background(width, height):
    # 生成随机灰度值作为金属底色 (0-255)
    base_gray = np.random.randint(128, 256, dtype=np.uint8)
    # 创建单通道背景
    background = np.full((height, width), base_gray, dtype=np.uint8)

    # 添加单通道噪声
    noise = np.random.normal(0, 15, (height, width)).astype(np.uint8)
    background = cv2.add(background, noise)

    # 高斯模糊保持不变（自动处理单通道）
    background = cv2.GaussianBlur(background, (5, 5), 0)

    # 对比度调整（单通道处理）
    alpha = 1.2
    beta = 30
    background = cv2.convertScaleAbs(background, alpha=alpha, beta=beta)

    return background


def generate_etched_circle(image, center, radius):
    # 创建一个与图像大小相同的掩码
    mask = np.zeros_like(image)
    cv2.circle(mask, center, radius, 255, -1)
    # 对圆形掩码边缘添加锯齿效果（保持单通道）
    for y in range(image.shape[0]):
        for x in range(image.shape[1]):
            if mask[y, x] == 255:
                distance = np.sqrt((x - center[0]) ** 2 + (y - center[1]) ** 2)
                if np.abs(distance - radius) < 5:
                    if np.random.randint(0, 2) == 0:
                        mask[y, x] = 0
    # 在掩码区域内生成蚀刻效果（单通道处理）
    etched_area = image.copy()
    for y in range(image.shape[0]):
        for x in range(image.shape[1]):
            if mask[y, x] == 255:
                # 单通道只需调整灰度值
                etched_area[y, x] = np.clip(etched_area[y, x] + np.random.randint(-30, 30), 0, 255)
    # 将蚀刻区域应用到原始图像（单通道无需维度扩展）
    result = np.where(mask == 255, etched_area, image)
    return result


# 图像尺寸
width, height = 800, 600

# 生成金属背景
metal_background = generate_metal_background(width, height)

# 圆形参数
center = (width // 2, height // 2)
radius = 50

# 在金属背景上生成蚀刻圆形
result_image = generate_etched_circle(metal_background, center, radius)

cv2.imwrite("C:/Users/1234/Desktop/img_test/122.bmp", result_image)

